Today's general-purpose processors, based on the Von Neumann Architecture, allow the execution of any arbitrary sequence of instructions. While this has lead to wide spread use, it also represents a major vulnerability as malicious code can easily be substituted and executed (as in a software virus). Since current processor architectures permit code and data to exist in the same memory space, it is relatively easy for one program to insert malicious code (as data) into the area in memory where another program is executing code. Programs that attempt to protect data from disclosure (for instance by using an encryption algorithm) are fraught with difficulty since the keys and instructions used by the program to encrypt its data can be inspected and reverse-engineered.
There are three general models of software development: waterfall, spiral, and evolutionary. FIG. 1 illustrates a classic software lifecycle 100 of a typical executable program. The five phases in the classic or waterfall model are Requirements, Specification, Implementation & Unit Testing, Integration & System Testing, and Operations & Maintenance. The last phase can be sub-divided into five sub-phases: Compile, Package, Distribute, Install, and Execute, with the final sub-phase further divided into load, fetch, and decode phases. The first four phases along with the compile and package sub-phases are typically performed within the trusted volume(s) of the developer/publisher and therefore have limited opportunity for malicious intervention. However, distribute, install, load, and fetch phases are highly susceptible to malicious intervention by third parties or third party viruses.